package main

import (
	"fmt"
	"regexp"
	"strconv"
)

func main() {
	regMatchString()
	regMatchNumber()
	regMatchFloat()
	// regMatchDiv()
	// regReplaceMatchFind()
}

// 匹配指定类型的字符串
func regMatchString() {
	buf := "abc azc a7c aac 888 a9c  tac"

	// 解析正则表达式，如果成功返回解释器
	reg1 := regexp.MustCompile(`a.c`)
	if reg1 == nil {
		fmt.Println("regexp err")
		return
	}

	// 根据规则提取关键信息
	result1 := reg1.FindAllString(buf, -1)
	result2 := reg1.ReplaceAllString(buf, "replaced")
	result3 := reg1.MatchString(buf)
	fmt.Println("origin: ", buf)
	fmt.Println("result1: ", result1)
	fmt.Println("result2: ", result2)
	fmt.Println("result3: ", result3)
}

// 匹配 a 和 c 中间包含一个数字的字符串
func regMatchNumber() {
	buf := "abc azc a7c aac 888 a9c  tac"

	// reg1 := regexp.MustCompile(`a\dc`)
	reg1 := regexp.MustCompile(`a[0-9]c`)

	if reg1 == nil {
		fmt.Println("regexp err")
		return
	}

	result1 := reg1.FindAllStringSubmatch(buf, -1)
	fmt.Println("result: ", result1)
}

// 匹配字符串中的小数
func regMatchFloat() {
	buf := "43.14 567 agsdg 1.23 7. 8.9 1sdljgl 6.66 7.8   "

	reg1 := regexp.MustCompile(`\d+\.\d+`)
	if reg1 == nil {
		fmt.Println("regexp err")
		return
	}

	result1 := reg1.FindAllStringSubmatch(buf, -1)
	fmt.Println("result: ", result1)
}

// 匹配 div 标签中的内容。

func regMatchDiv() {
	// 原生字符串
	buf := `
    
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <title>C语言中文网 | Go语言入门教程</title>
</head>
<body>
    <div>Go语言简介</div>
    <div>Go语言基本语法
    Go语言变量的声明
    Go语言教程简明版
    </div>
    <div>Go语言容器</div>
    <div>Go语言函数</div>
</body>
</html>
	`

	reg1 := regexp.MustCompile(`<div>(?s:(.*?))</div>`)
	if reg1 == nil {
		fmt.Println("regexp err")
		return
	}

	result1 := reg1.FindAllStringSubmatch(buf, -1)
	fmt.Println("result: ", result1)

	for _, text := range result1 {
		fmt.Println(text[1])
	}
}

// 通过 Compile 方法返回一个 Regexp 对象，实现匹配，查找，替换相关的功能。
func regReplaceMatchFind() {
	//目标字符串
	searchIn := "John: 2578.34 William: 4567.23 Steve: 5632.18"
	pat := "[0-9]+.[0-9]+" //正则

	f := func(s string) string {
		v, _ := strconv.ParseFloat(s, 32)
		return strconv.FormatFloat(v*2, 'f', 2, 32)
	}

	fmt.Printf("style: %T   value: %v\n", []byte(searchIn), []byte(searchIn))
	fmt.Printf("%s", []byte(searchIn))

	if ok, _ := regexp.Match(pat, []byte(searchIn)); ok {
		fmt.Println("Match Found!")
	}
	re, _ := regexp.Compile(pat)
	//将匹配到的部分替换为 "##.#"
	str := re.ReplaceAllString(searchIn, "##.#")
	fmt.Println(str)
	//参数为函数时
	str2 := re.ReplaceAllStringFunc(searchIn, f)
	fmt.Println(str2)
}
